<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>新建、索引和删除文档 | Elasticsearch: 权威指南 | Elastic</title>
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
</head>
<body>
<div class="main-container">
    <section id="content">
        
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原文地址: <a href="https://www.elastic.co/guide/cn/elasticsearch/guide/current/distrib-write.html" rel="nofollow">https://www.elastic.co/guide/cn/elasticsearch/guide/current/distrib-write.html</a>, 版权归 www.elastic.co 所有<br/>
                            英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/guide/current/distrib-write.html" rel="nofollow">https://www.elastic.co/guide/en/elasticsearch/guide/current/distrib-write.html</a>
                            </div>
                        <!-- start body -->
                  <div class="page_header">
<b>请注意:</b><br>本书基于 Elasticsearch 2.x 版本，有些内容可能已经过时。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch: 权威指南</a></span>
»
<span class="breadcrumb-link"><a href="getting-started.html">基础入门</a></span>
»
<span class="breadcrumb-link"><a href="distributed-docs.html">分布式文档存储</a></span>
»
<span class="breadcrumb-node">新建、索引和删除文档</span>
</div>
<div class="navheader">
<span class="prev">
<a href="how-primary-and-replica-shards-interact.html">« 主分片和副本分片如何交互</a>
</span>
<span class="next">
<a href="distrib-read.html">取回一个文档 »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="distrib-write"></a>新建、索引和删除文档<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/040_Distributed_CRUD/15_Create_index_delete.asciidoc">edit</a>
</h2>
</div></div></div>
<p>新建、索引和删除 请求都是 <em>写</em> 操作， 必须在主分片上面完成之后才能被复制到相关的副本分片，如下图所示 <a class="xref" href="distrib-write.html#img-distrib-write" title="新建、索引和删除单个文档">Figure 9, “新建、索引和删除单个文档”</a>.</p>
<div id="img-distrib-write" class="imageblock">
<div class="content">
<img src="../images/elas_0402.png" alt="新建、索引和删除单个文档">
</div>
<div class="title">Figure 9. 新建、索引和删除单个文档</div>
</div>
<p>以下是在主副分片和任何副本分片上面
成功新建，索引和删除文档所需要的步骤顺序：</p>
<div class="olist orderedlist">
<ol class="orderedlist">
<li class="listitem">
客户端向 <code class="literal">Node 1</code> 发送新建、索引或者删除请求。
</li>
<li class="listitem">
节点使用文档的 <code class="literal">_id</code> 确定文档属于分片 0 。请求会被转发到 <code class="literal">Node 3</code>，因为分片 0 的主分片目前被分配在 <code class="literal">Node 3</code> 上。
</li>
<li class="listitem">
<code class="literal">Node 3</code> 在主分片上面执行请求。如果成功了，它将请求并行转发到 <code class="literal">Node 1</code> 和 <code class="literal">Node 2</code> 的副本分片上。一旦所有的副本分片都报告成功, <code class="literal">Node 3</code> 将向协调节点报告成功，协调节点向客户端报告成功。
</li>
</ol>
</div>
<p>在客户端收到成功响应时，文档变更已经在主分片和所有副本分片执行完成，变更是安全的。</p>
<p>有一些可选的请求参数允许您影响这个过程，可能以数据安全为代价提升性能。这些选项很少使用，因为Elasticsearch已经很快，但是为了完整起见，在这里阐述如下：</p>
<div class="variablelist">
<dl class="variablelist">
<dt>
<span class="term">
<code class="literal">consistency</code>
</span>
</dt>
<dd>
<p>consistency，即一致性。在默认设置下，即使仅仅是在试图执行一个_写_操作之前，主分片都会要求 必须要有 <em>规定数量(quorum)</em>（或者换种说法，也即必须要有大多数）的分片副本处于活跃可用状态，才会去执行_写_操作(其中分片副本可以是主分片或者副本分片)。这是为了避免在发生网络分区故障（network partition）的时候进行_写_操作，进而导致数据不一致。_规定数量_即：</p>
<pre class="literallayout">int( (primary + number_of_replicas) / 2 ) + 1</pre>

<p><code class="literal">consistency</code> 参数的值可以设为 <code class="literal">one</code> （只要主分片状态 ok 就允许执行_写_操作）,<code class="literal">all</code>（必须要主分片和所有副本分片的状态没问题才允许执行_写_操作）, 或 <code class="literal">quorum</code> 。默认值为 <code class="literal">quorum</code> , 即大多数的分片副本状态没问题就允许执行_写_操作。</p>
<p>注意，<em>规定数量</em> 的计算公式中 <code class="literal">number_of_replicas</code> 指的是在索引设置中的设定副本分片数，而不是指当前处理活动状态的副本分片数。如果你的索引设置中指定了当前索引拥有三个副本分片，那规定数量的计算结果即：</p>
<pre class="literallayout">int( (primary + 3 replicas) / 2 ) + 1 = 3</pre>

<p>如果此时你只启动两个节点，那么处于活跃状态的分片副本数量就达不到规定数量，也因此您将无法索引和删除任何文档。</p>
</dd>
<dt>
<span class="term">
<code class="literal">timeout</code>
</span>
</dt>
<dd>
<p>如果没有足够的副本分片会发生什么？ Elasticsearch会等待，希望更多的分片出现。默认情况下，它最多等待1分钟。
如果你需要，你可以使用 <code class="literal">timeout</code> 参数 使它更早终止： <code class="literal">100</code> 100毫秒，<code class="literal">30s</code> 是30秒。</p>
</dd>
</dl>
</div>
<div class="note admon">
<div class="icon"></div>
<div class="admon_content">
<p>新索引默认有 <code class="literal">1</code> 个副本分片，这意味着为满足 <code class="literal">规定数量</code> <em>应该</em> 需要两个活动的分片副本。
但是，这些默认的设置会阻止我们在单一节点上做任何事情。为了避免这个问题，要求只有当 <code class="literal">number_of_replicas</code> 大于1的时候，规定数量才会执行。</p>
</div>
</div>
</div>
<div class="navfooter">
<span class="prev">
<a href="how-primary-and-replica-shards-interact.html">« 主分片和副本分片如何交互</a>
</span>
<span class="next">
<a href="distrib-read.html">取回一个文档 »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>